package chapter03

/**
 * Created with IntelliJ IDEA.
 * ClassName: Test01
 * Package: chapter03
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 *          Date: 2023-06-18
 *          Time: 13:18
 */

//运算符
object Test01_TestOperator {
  def main(args: Array[String]): Unit = {
    //1.算数运算符
    val result = 10 / 3
    println(result)

    val result2: Double = 10 / 3
    println(result2) //3.0

    val result3: Double = 10.0 / 3
    println(result3.formatted("%.2f")) //3.3333333333333335
    //formatted 格式化输出 保留两位小数

    //取余数
    val result4 = 10 % 3
    println(result4) //1

    //2.比较运算符 判断相等 和Java有不同之处
    val s1: String = "hello"
    //这里new 的String 还是Java中的String
    val s2: String = new String("hello")

    //在Scala中字符串 是可以直接使用 == 来比较的
    println(s2 == s1) //true
    println(s1.equals(s2)) //就等价与 == 比较了
    // 如果自己定义的类型 没有重写equals的话也是不能判断的
    //eq方法是用来判断引用地址是否相等的
    println(s1.eq(s2)) //false

    println("=====================")

    //逻辑运算符 具有短路运算的特点
    //4>5 是false 那么就不会在执行m函数了
    def m(n: Int): Int = {
      println("m被调用")
      return n
    }

    val n = 1
    println((4 > 5) && m(n) > 0)

    //实际运用当中 判断一个字符串是否为空
    def isNotEmpty(str: String): Boolean = {
      //str != null 如果真的是null了 那么直接短路返回false
      // 就不会出发后面因为是null产生的空指针异常
      return str != null && !("".equals(str.trim))
    }

    println(isNotEmpty(null))

    //赋值运算符
    var b: Byte = 10
    //b += 1 //是不可以的 类型是Int
    println(b)

    var i: Int = 10
    i += 1
    println(i)

    //位运算符
    val a: Byte = 60
    //左移运算符 运算结果自动转换为int
    println(a << 3) //480 60*2^3 = 480
    println(a >> 2) //15 60/2^2 = 15

    val b1: Short = -13
    println(b1 << 2) //-52 符号位不变 移动符号位之前的数 补零
    println(b >> 2) //2 右移 补符号位
    println(b1 >>> 2) //无符号右移


    //Scala运算符的本质 底层当作一个对象的方法调用来使用
    val n1: Int = 12
    val n2: Int = 37
    //n1这个数调用.+()的一个方法（也验证了之前操作数可以作为标识符命名的规则）
    // 参数是宁一个操作数
    println(n1.+(n2))
    println(n1 + n2)

    println(1.23.*(25))
    //先转为Int 在转为String
    //println(7.5 toInt toString)


  }
}
